23

» WarCraft 3 / Плавающий текст, следующий над юнитом (Reforged)

Похожие вопросы:

ответ
Атака оглушением вызывает подобную ерунду. Да и не только.
Например в доте бы вылетало сообщение 0 при атаке имея МКБ - сообщался бы урон, урон от микробаша, если бы выпал и 0.00 от нулевого критического удара.
Решение простое - поставь условие, что полученный урон больше 0.00, тогда только выводить.
ответ
но когда срабатывает одновременно в некоторых случаях текст остается, в чем причина не знаю
причина в бж функциях
избавься от бж и всё норм будет

23

» WarCraft 3 / Как создавать приказы юнитам?

Похожие вопросы:

ответ
UniverseRuler, в доте 6-6 использованы игроки 13 и 14
тебе нужно просто сохранять приказ отданный триггерно(ты ведь ими будешь юнитами управлять)
и восстанавливать его при получение приказа для игрока
для этого нужна буленовская переменная для определения триггерный это приказ или нет
и структура/хэш/юзердата для сохранения приказа
UniverseRuler:
еще остались асы картостроения, но а сейчас начинаю думать, что их все таки нету
если ас картостроения это человек который воплощает все ваши фантазии в жизнь то тут таких нету и не было
ещё можно создавать всех юнитов за 1 резервного игрока
а автоатаку делать триггерно
этот вариант самый лучший но то просто не сможешь его сделать
ибо нужны джасс+алгоритмы+структуры/хэш
а ты судя по всему ничего из этого не знаешь
ответ
pro100master, но ведь это собьет и его текущие приказы?

Upd.:Я понял в чем проблема.
Я хочу чтоб можно было использовать способности юнита, при этом чтоб были недоступны атака/перемещение итд., а ведь это тоже его способности...
Короче я загнал себя в угол.
Пожалуй пойду по пути создания торговца-здания.
Но если у кого есть решение моей дилемы - буду рад!
ответ
после разложения костей юниты сами выгружаются из памяти
функция "wait" то же вызывает утечки
она не вызывает утечки, она сама по себе кривая и не подходит под большинство задач
если создать переменную "Point" типа "точка" и изначально задать ей положение центр области "Final", а потом обращаться уже к этой переменной "Point" в триггере событие "боевая единица входит в область "Start", действие "отдать приказ боевой единице следовать в "Point" , то новые точки создаваться не будут?
да
только в гуи еще и создание юнитов утекает тоже насколько я помню, надо тоже заранее точку делать
впринципе можно было бы обойтись одной точкой на все действия, но вам видимо пока рано

23

» WarCraft 3 / Контроль сохранений

Похожие вопросы:

ответ
pro100master, но ведь это собьет и его текущие приказы?

Upd.:Я понял в чем проблема.
Я хочу чтоб можно было использовать способности юнита, при этом чтоб были недоступны атака/перемещение итд., а ведь это тоже его способности...
Короче я загнал себя в угол.
Пожалуй пойду по пути создания торговца-здания.
Но если у кого есть решение моей дилемы - буду рад!

23

» WarCraft 3 / Бафф Ловчий.

Похожие вопросы:

ответ
Кет, баф накладывается когда прилетает снаряд
при касте бафа нету
поэтому он и не снимается
ответ
SetUnitPropWindow
Спс, что то раньше этой нативки не видел, ну пока сделал на пересоздании предмета, там посмотрим.

23

» WarCraft 3 / Критическая ошибка в карте

Похожие вопросы:

ответ
nvc123:
PT153, в карте утечки
утечки может вызывать всё что угодно кроме чисел и игроков
Да, уже я выяснил, что в карте были утечки multiboard item, из-за отсутствия MultiboardReleaseItem.
ответ
GRESHNIK1, ошибку вызывает каждая из 3 моделей?
или лишь 1 из них?
ну а вообще критует из за того что модель кривая
либо брось это дело либо сконверти их в mdl и правь через блокнот
ответ
Уже ничего не поделаешь, скорее всего. На будущее - не давать областям и другим объектам названий на русском.

23

» WarCraft 3 / Нужна иконка!

Похожие вопросы:

ответ
Вот, держи)
ответ
RAKAJL, "Графика - Пиктограмма: игровой интерфейс".
ответ
Все что есть коснанты являет разрешеным а остальные пока напрямую обратить нельзя (некоторые работали) Моли близзарду чтобы все равкод поля открыли
ответ
Ты прав в ПО и ИИ их нет, достать пути можно с помощью war3.mpq, держи:
иконки
ReplaceableTextures\CommandButtons\BTNRallyPointUndead.blp
ReplaceableTextures\CommandButtons\BTNRallyPointNightElf.blp
ReplaceableTextures\CommandButtons\BTNOrcRallyPoint.blp
модели флага
UI\Feedback\RallyPoint\NightElfRallyFlag.mdx
UI\Feedback\RallyPoint\OrcRallyFlag.mdx
UI\Feedback\RallyPoint\UndeadRallyFlag.mdx

И да, вот твоя синяя иконка - ReplaceableTextures\CommandButtons\BTNSelectUnit.blp

23

» WarCraft 3 / Вопрос по системе Save/Load

Похожие вопросы:

ответ
Кто-то объяснит почему 36 символьная система? можно использовать разные case написания ещё ведь. Да и еще кучу других символов. Почему именно 36, непонятно..
theGCI, NickIAm тебе вроде нормальный гайд выложил, там доступно написано.
NickIAm:
Используя только английский язык например можно задействовать 94 символа.. как пример
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&* ()_+=,.<>?/:;'{}[]|\~` 
function SaveLoad_InitialSetup takes nothing returns nothing
    local integer i = 0
    local integer j = 0

    loop
        set udg_SaveLoad_Compress[i + 48] = j
        set udg_SaveLoad_Uncompress[i] = i + 48
        set j = j + 1
        set i = i + 1
        exitwhen i >= 10
    endloop
    set i = 0
    loop
        set udg_SaveLoad_Compress[i + 97] = j
        set udg_SaveLoad_Compress[i + 65] = j + 26
        set udg_SaveLoad_Uncompress[i + 10] = i + 97
        set udg_SaveLoad_Uncompress[i + 26 + 10] = i + 65
        set j = j + 1
        set i = i + 1
        exitwhen i >= 26
    endloop
endfunction

function SaveLoad_Id2CId takes integer n returns integer
    local integer i = n / (256 * 256 * 256)
    local integer r
    set n = n - i * (256 * 256 * 256)
    set r = udg_SaveLoad_Compress[i]
    set i = n / (256 * 256)
    set n = n - i * (256 * 256)
    set r = r * 64 + udg_SaveLoad_Compress[i]
    set i = n / 256
    set r = r * 64 + udg_SaveLoad_Compress[i]
    return r * 64 + udg_SaveLoad_Compress[n - i * 256]
endfunction

function SaveLoad_CId2Id takes integer n returns integer
    local integer i = n / (64 * 64 * 64)
    local integer r
    set n = n - i * (64 * 64 * 64)
    set r = udg_SaveLoad_Uncompress[i]
    set i = n / (64 * 64)
    set n = n - i * (64 * 64)
    set r = r * 256 + udg_SaveLoad_Uncompress[i]
    set i = n / 64
    set r = r * 256 + udg_SaveLoad_Uncompress[i]
    return r * 256 + udg_SaveLoad_Uncompress[n - i * 64]
endfunction


function SaveLoad_Unit2Integer takes unit u returns integer
    local integer i = 0
    local integer n = GetUnitTypeId(u)
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    loop
        set i = i + 1
        exitwhen i > udg_SaveLoad_Heroes_LastIndex
        if udg_SaveLoad_Heroes[i] == n then
            return i
        endif
    endloop
    return SaveLoad_Id2CId(n)
endfunction
function SaveLoad_Integer2Unit takes integer i returns integer
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    if i <= udg_SaveLoad_Heroes_LastIndex then
        return udg_SaveLoad_Heroes[i]
    endif
    return SaveLoad_CId2Id(i)
endfunction

function SaveLoad_Item2Integer takes item t returns integer
    local integer i = 0
    local integer n = GetItemTypeId(t)
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    loop
        set i = i + 1
        exitwhen i > udg_SaveLoad_Items_LastIndex
        if udg_SaveLoad_Items[i] == n then
            return i
        endif
    endloop
    return SaveLoad_Id2CId(n)
endfunction
function SaveLoad_Integer2Item takes integer i returns integer
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    if i <= udg_SaveLoad_Items_LastIndex then
        return udg_SaveLoad_Items[i]
    endif
    return SaveLoad_CId2Id(i)
endfunction

function SaveLoad_Ability2Integer takes integer a returns integer
    local integer i = 0
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    loop
        set i = i + 1
        exitwhen i > udg_SaveLoad_Abilities_LastIndex
        if udg_SaveLoad_Abilities[i] == a then
            return i
        endif
    endloop
    return SaveLoad_Id2CId(a)
endfunction
function SaveLoad_Integer2Ability takes integer i returns integer
    if udg_SaveLoad_Initialized == false then
        set udg_SaveLoad_Initialized = true
        call SaveLoad_InitialSetup()
    endif
    if i <= udg_SaveLoad_Abilities_LastIndex then
        return udg_SaveLoad_Abilities[i]
    endif
    return SaveLoad_CId2Id(i)
endfunction

function SaveLoad_Color takes string s returns string
    local integer i = StringLength(s)
    local string c
    local string r = ""

    loop
        set i = i - 1
        set c = SubString(s,i,i + 1)
        if c == "0" or c == "1" or c == "2" or c == "3" or c == "4" or c == "5" or c == "6" or c == "7" or c == "8" or c == "9" then
            set r = "|cffffcc00" + c + "|r" + r
        elseif c == "-" then
            set r = "|cffdddddd-|r" + r
        elseif c == "a" or c == "b" or c == "c" or c == "d" or c == "e" or c == "f" or c == "g" or c == "h" or c == "i" or c == "j" or c == "k" or c == "l" or c == "m" or c == "n" or c == "o" or c == "p" or c == "q" or c == "r" or c == "s" or c == "t" or c == "u" or c == "v" or c == "w" or c == "x" or c == "y" or c == "z" then    
            set r = "|cff00cc00" + c + "|r" + r
        elseif c == "A" or c == "B" or c == "C" or c == "D" or c == "E" or c == "F" or c == "G" or c == "H" or c == "I" or c == "J" or c == "K" or c == "L" or c == "M" or c == "N" or c == "O" or c == "P" or c == "Q" or c == "R" or c == "S" or c == "T" or c == "U" or c == "V" or c == "W" or c == "X" or c == "Y" or c == "Z" then    
            set r = "|cff3399ff" + c + "|r" + r
        else
            set r = c + r
        endif
        exitwhen i <= 0
    endloop
    return r
endfunction

function SaveLoad_EncodeChar takes string n returns integer
    local integer i = 0
    local string s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    local string s2 = "abcdefghijklmnopqrstuvwxyz"
    local string s3 = "0123456789"

    loop
        if SubString(s1,i,i + 1) == n then
            return i
        endif
        if SubString(s2,i,i + 1) == n then
            return i
        endif
        set i = i + 1
        exitwhen i >= 26
    endloop
    set i = 0
    loop
        if SubString(s3,i,i + 1) == n then
            return i
        endif
        set i = i + 1
        exitwhen i >= 10
    endloop
    return 0
endfunction

function SaveLoad_EncodeVerify takes string buffer returns integer
    local integer i = 0
    local integer j = 0
    local string name = GetPlayerName(GetTriggerPlayer())
    if udg_SaveLoad_UsePlayername == true then
        loop
            set j = j + SaveLoad_EncodeChar(SubString(name,i,i + 1))
            set i = i + 1
            exitwhen i >= StringLength(name)
        endloop
    endif
    set i = 0
    loop
        set j = j + SaveLoad_EncodeChar(SubString(buffer,i,i + 1))
        set i = i + 1
        exitwhen i >= StringLength(buffer)
    endloop
    return j
endfunction

function SaveLoad_EncodeValues takes nothing returns string
    local integer i
    local integer j
    local integer k
    local integer l
    local integer m
    local integer CodeLength = StringLength(udg_SaveLoad_Alphabet)
    local integer array a
    local string buffer = ""
    local string c = ""
    local integer skip = 0
    local integer CONST = 1000000
    local string abc = "0123456789"

    set i = 0
    loop
        set i = i + 1
        exitwhen i > udg_SaveCount
        set buffer = buffer + I2S(udg_Save[i]) + "-"
    endloop
    set buffer = buffer + I2S(SaveLoad_EncodeVerify(buffer))
    if udg_Save[1] == 0 then
        set buffer = "-" + buffer
    endif

    set i = 0
    loop
        set a[i] = 0
        set i = i + 1
        exitwhen i >= 100
    endloop

    set m = 0
    set i = 0
    loop
        set j = 0
        loop
            set a[j] = a[j] * 11
            set j = j + 1
            exitwhen j > m
        endloop

        set l = 0
        set c = SubString(buffer,i,i + 1)
        loop
            exitwhen SubString(abc,l,l + 1) == c
            set l = l + 1
            exitwhen l > 9
        endloop
        set a[0] = a[0] + l

        set j = 0
        loop
            set k = a[j] / CONST
            set a[j] = a[j] - k * CONST
            set a[j + 1] = a[j + 1] + k
            set j = j + 1
            exitwhen j > m
        endloop
        if k > 0 then
            set m = m + 1
        endif
        set i = i + 1
        exitwhen i >= StringLength(buffer)
    endloop

    set buffer = ""
    loop
        exitwhen m < 0
        set j = m
        loop
            exitwhen j <= 0
            set k = a[j] / CodeLength
            set a[j - 1] = a[j - 1] + (a[j] - k * CodeLength) * CONST
            set a[j] = k
            set j = j - 1
        endloop
        set k = a[j] / CodeLength
        set i = a[j] - k * CodeLength
        set buffer = buffer + SubString(udg_SaveLoad_Alphabet,i,i + 1)
        set a[j] = k
        if a[m] == 0 then
            set m = m - 1
        endif
    endloop

    set i = StringLength(buffer)
    set skip = 0
    set c = ""
    loop
        set i = i - 1
        set c = c + SubString(buffer,i,i + 1)
        set skip = skip + 1
        if skip == 4 and i > 0 then
            set c = c + "-"
            set skip = 0
        endif
        exitwhen i <= 0
    endloop
    return c
endfunction

function SaveLoad_DecodeValues takes string s returns boolean
    local integer i
    local integer j
    local integer k
    local integer l
    local integer SaveCode = 0
    local integer m
    local integer array a
    local string buffer = ""
    local integer CodeLength = StringLength(udg_SaveLoad_Alphabet)
    local integer skip = -1
    local integer CONST = 1000000
    local string abc = "0123456789-"
    local string c

    set i = 0
    loop
        set a[i] = 0
        set i = i + 1
        exitwhen i >= 100
    endloop

    set m = 0

    set i = 0
    loop
        set j = 0
        loop
            set a[j] = a[j] * CodeLength
            set j = j + 1
            exitwhen j > m
        endloop

        set skip = skip + 1
        if skip == 4 then
            set skip = 0
            set i = i + 1
        endif

        set l = CodeLength
        set c = SubString(s,i,i + 1)
        loop
            set l = l - 1
            exitwhen l < 1
            exitwhen SubString(udg_SaveLoad_Alphabet,l,l + 1) == c
        endloop
        set a[0] = a[0] + l

        set j = 0
        loop
            set k = a[j] / CONST
            set a[j] = a[j] - k * CONST
            set a[j + 1] = a[j + 1] + k
            set j = j + 1
            exitwhen j > m
        endloop
        if k > 0 then
            set m = m + 1
        endif
        set i = i + 1
        exitwhen i >= StringLength(s)
    endloop

    loop
        exitwhen m < 0
        set j = m
        loop
            exitwhen j <= 0
            set k = a[j] / 11
            set a[j - 1] = a[j - 1] + (a[j] - k * 11) * CONST
            set a[j] = k
            set j = j - 1
        endloop
        set k = a[j] / 11
        set i = a[j] - k * 11
        set buffer = SubString(abc,i,i + 1) + buffer
        set a[j] = k
        if a[m] == 0 then
            set m = m - 1
        endif
    endloop

    set i = 0
    set j = 0
    loop
        loop
            exitwhen i >= StringLength(buffer)
            exitwhen i > 0 and SubString(buffer,i,i + 1) == "-" and SubString(buffer,i - 1,i) != "-"
            set i = i + 1
        endloop
        if i < StringLength(buffer) then
            set k = i
        endif
        set SaveCode = SaveCode + 1
        set udg_Save[SaveCode] = S2I(SubString(buffer,j,i))
        set j = i + 1
        set i = i + 1
        exitwhen i >= StringLength(buffer)
    endloop

    set j = SaveLoad_EncodeVerify(SubString(buffer,0,k))
    set udg_SaveCount = SaveCode - 1
    if j == udg_Save[SaveCode] then
        return true
    endif
    return false
endfunction

function SaveLoad_Encode takes nothing returns string
    if udg_SaveLoad_CaseSensitive == false then
        set udg_SaveLoad_Alphabet = StringCase(udg_SaveLoad_Alphabet,true)
    endif
    return SaveLoad_Color(SaveLoad_EncodeValues())
endfunction

function SaveLoad_Decode takes string s returns boolean
    if udg_SaveLoad_CaseSensitive == false then
        set udg_SaveLoad_Alphabet = StringCase(udg_SaveLoad_Alphabet,true)
        set s = StringCase(s,true)
    endif
    if SaveLoad_DecodeValues(s) then
        call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"")
        return true
    endif
    call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"Decoding failed")
    return false
endfunction

23

» WarCraft 3 / Проигрыш анимации

Похожие вопросы:

ответ
Примерно так:
Заранее поставить на карте область
Событие - Юнит заходит в область
Условие - Входящий юнит = (необходимый юнит)
Действие - Включить режим кинематики (скрыть интерфейс), и так далее...
Выключить этот триггер (чтобы не повторялось сначала)
Вот статья по регионам, камерам, спецэффектам:

23

» WarCraft 3 / Проблема с эффектом

Похожие вопросы:

ответ
~8gabriel8:
Это жесть, что ты сделал) Этот русификатор триггеров уж такую муть содержит, что ты просто какую-то белиберду сотворил. Исправил до рабочего вида, но чтобы совсем красиво было, это не ко мне, а к джассерам. Просто времени мало на всё, а исправление этих триггеров затратило его довольно много.
ответ
чесн, в этом триггере прекрасно все
от точки, которая создается, не используется, но удаляется
пика группы юнитов, которые все суммарно сколько их на карте нанесут бедной цели урон
и до атакованного юнита, которого вообще здесь не может быть)

что по сути, так я хз как можно прозевать "Цель способности", или как оно у вас называется в русифицированных триггерах. на стандартной версии это target of ability being cast
цикл здесь скорее всего не нужен, если конечно только смысл действительно в том что бы брать всех огров на карте и наносить цели урон.
ответ
Остальные не помню, откуда.
Сборку игры я спрашивал.
WAGARAX:
Время - 1.1 сек
Верни 5 секунд в игровых константах.
А ещё перезагрузи компьютер.

23

» WarCraft 3 / Смена модели героя

Похожие вопросы:

ответ
  1. Чтобы иметь и модель с обычной текстурой и с другой, с помощью программы для извлечения моделей из Warcraft 3 (я пользуюсь обычно Warcraft 3 Viewer, поищи на сайте), там ищешь справа в папках твою модель, извлекаешь её к себе на компьютер.
  1. Потом открываешь программой mdlvis (основная программа для моделлинга, тоже здесь есть) модель, сразу выделяешь её и нажимаешь кнопку UV-карты или модули - редактор текстур.
  1. Внизу есть путь для текстуры, измени на название скачанной. Нажми enter, сохрани модель.
  1. Если текстура специально для той модели, переходи к следующему пункту.
  1. Кинь текстуру и модель в папку с вариком и открывай WE. У тебя стандартная модель и модель с другой текстурой.

Возможно, звучит сложно, но я привык, несколько кликов - и текстура изменена.
ответ
Есть способность "Тёмный", если дать её юниту, то он заменится на юнит указанный в способности.У такого варианта наименьшее число неудобств.
ответ
Если смена модели должна пройти без потери функциональности юнита - морфом или способностью "тёмный".
ответ
создавайте новых юнитов ручками это будет быстрее чем вы изучите мемхак и поймёте как использовать функцию смены модели
function ChangeUnitModelTo takes unit u, string modelpath returns nothing
	local integer a
	local integer s
    call MakeModelAsDefault(u,modelpath)
	set LastConvertedHandle=ConvertHandle(u)
	if LastConvertedHandle>0 then
		set a=RMem(LastConvertedHandle)+0x88
		if a>0 then
			set a=RMem(a)
			if a>0 then
				set s=GetStringAddress(modelpath)
				call CallThisCallWith3Args(a,LastConvertedHandle,s,1)
			endif
		endif
	endif
endfunction

function ChangeUnitPortraitTo takes unit u, string modelpath returns nothing
	set LastConvertedHandle=ConvertHandle(u)
	if LastConvertedHandle>0 then
		call CallThisCallWith3Args(GameDLL+0x33ADC0,LastConvertedHandle,GetStringAddress(modelpath),1)
	endif
endfunction
В карте про сларков таком способом меняется модель лягушки после эволюции
ответ
Яд, и всё работает.

23

» WarCraft 3 / Наведение мыши на юнита

Похожие вопросы:

ответ
Хозяин Миров, для начала прочитать весь список функций
или научится юзать поиск по функциям
ибо GetRandomInt(n,m)
где n начало промежутка из которого берутся числа а m конец

23

» WarCraft 3 / Атака юнита

Похожие вопросы:

ответ
Посмотри код её приказа и отдавай через приказ, в чём проблема?
Способности через GUI только стандартные кастуются и те, что имеют такой же приказ.
ответ
Ох, увы наверное никак, как не пытались мы, не нашли ничего толкового

23

» WarCraft 3 / Сделать один лимит у здания с другим зданием

Похожие вопросы:

ответ
~8gabriel8:
Каждый вопрос заслуживает отдельного обсуждения, а на все стало лень ответ печатать, когда начал.
Печатать реально долго, легче было реализовать примеры в карте:
Кроме последнего пункта, его нужно персонально рассматривать, так как игра не подразумевает использование для юнита двух списков. Например, можно наполнить список построек у юнита всеми зданиями, часть из которых блокировать при открытии одного списка и разблокировать при открытии второго, но это подходит, когда один рабочий. Можно сделать второй список из книги заклинаний, куда добавлены способности на основе игрушечных строений, чтобы было видно карту пути и всё такое, но там для них используется один приказ, то есть всегда одинаковое здание будет при нажатии на любую способность, а ещё нет стоимости золота и дерева, что тоже придётся как-то ваять триггерно. Можно перевоплощать юнита при смене списка в другого, но там тоже сложности, не помню точно какие, вроде бы связаны с расой, так как все строят по-разному.

С точкой сбора всё просто. Способность у игрока не заблокировать, потому нужно забрать её у всех зданий, которые есть на карте, либо будут построены.

Группа из максимум 9 юнитов работает немножко коряво, ранее мы с PT153 находили какой-то вариант, чтобы работало быстро, но лень пользоваться поиском. Вроде каждую 0.01 секунду проверялось количество выбранных юнитов, лишние удалялись из выбора.

Чтобы не было очереди, пришёл в голову лишь вариант с апгрейдом здания. Но у меня реализован просто пример для одного конкретного здания, а для нескольких абстрактных зданий нужно делать текстовым триггером, который будет для каждого здания запускать локальный таймер на нужное время и добавлять анимационный текстаг work. По отмене апгрейда, либо истечению таймера анимационный тег удаляется и создаётся воин, к которому привязывается соответствующий звук. Но есть и другие варианты, типа создавать внутри здания другое, которое реально будет производить юнитов, когда заказал апгрейд, там иная реализация. И не упомянул про затрачиваемые ресурсы. Потребуется забирать/возвращать часть ресурсов при отмене апгрейда.

На примере триггеров и фиолетовых строк в редакторе объектов смотри, как сделано улучшение Бугая в Дренорского бугая.

Конечно, мог бы сделать MUI триггер на GUI для отсутствия очереди, но это было бы громоздко и в техническом смысле уродливо. производящие здания заносились бы в массив, для которого будет массив таймеров, которые будут заноситься в виде событий на истечение таймера в другой триггер, а точнее будет несколько массивов таймеров, по максимальному числу тренируемых юнитов в любом производящем здании.

Нашёл твои вопросы:
В них бы и спрашивал, что непонятно. А то тебе отвечают, а ты игнорируешь, словно очень умный.
Тебе даже вариант без триггеров для четвёртого пункта сделали: xgm.guru/p/wc3/230191/comments?postid=426457#comment5

23

» WarCraft 3 / Утечки памяти

Похожие вопросы:

ответ
Да. При чем две.( Position of Dying unit ).
скрин скинул выше, но там ошибка. И если раскрыть, то обнаруживается еще одна утечка: на гуи Point(0,0), а на jass эта команда называется по-другому Location(0,0), эта функция создает точку
раскрыть
попробуй раскрутить, и использовать эту
native CreateItem takes integer itemid, real x, real y returns item
через CS: call CreateItem( id, GetUnitX(u), GetUnitY(u))
где id - ид-номер типа предмета, u - юнит. Ввести тип предмета, и юнита нужно.
можно еще запомнить как-то, чтобы к предмету как-то обращаться
через CS: set it = CreateItem( id, GetUnitX(u), GetUnitY(u))
где it - переменная предмета. Объявить переменную и обращаться
ответ
zontik2012 нет, не является утечкой. Если бы ты крепил эффект к точке, к примеру в позиции юнита, причем не удалял бы эту точку потом - то это была бы утечка
ответ
но условие можно переделать как угодно...например для входящего юнита в область это только пример того как записать диалог в таблицу и очищать хэндл чтобы не вызвал утечек
NazarPunk:
потом я его очищаю
Кто первый клик, того и тапки))
)))
принцип наверное понятен?
можно и не очищать диалог при входе в область hero spawn а потом но лучше очищать заранее
теперь так выглядит
спасибо за ответы

23

» WarCraft 3 / Поиск карты

Похожие вопросы:

ответ
"давным давно" это сколько лет назад? И что-нибудь поподробнее. Выживание кем? Какой геймплей?
ответ
Похоже, это таки важный параметр. Будет учтено.
ответ
~8gabriel8:
Holy War?
Как раз за жуков Вадим играет:
Можно выбирать режимы против крипов или против других игроков.

Вкладка была открыта, но ответ Sheridan_75 не высветился.
ответ
Могу понакидать карт с качественными (в какой-то мере) нестандартными расами, т.к 23 расы не особо хорошо сделаны.
ответ
Wc3MapAnticheatAntivirus - Сканер карт [Вирусы,Читпаки,Читы,Ники]. Автор - "Abso". Название программы вбей в гугле, там будет единственная ссылка где скачать.

23

» WarCraft 3 / Проблемы с анимациями

Похожие вопросы:

ответ
nvc123:
Nyanta, для начала дебаг сделать как написано в статье
Сделал. Триггер работает как нужно. При входе всегда пишет "Вход!", при выходе - "Выход!". Порядок текста не меняется.
В общем, проблема, почему-то, была в названии анимации. Открыл модель через MdlVis и назвал анимации "родными" словами Stand, Walk, Death. Стало работать как надо.
Спасибо Rare за
Rare:
ставь скорость анимации на 0%
И nvc123 за то, что натолкнул на мысль этим)
nvc123:
конфликт триггеров,неправильный проигрыш анимаций
ответ
Анимация кости базы при death сместилась у конечной точки в линейке анимации. Поправил. В игре потестил, работает. Рассчитать границы нужны когда делаешь новые или изменяешь старые анимации, одна из причин чтоб анимация не сместилась и была на своем месте. Но в твоем случае она сразу не помогла.
ответ
скорее всего связано с кешированием данных, попробуй первым на карту занружать юнитов, и только потом декорации
ответ
XGM Bot:
Похожие вопросы:

ответ
nvc123:
Nyanta, для начала дебаг сделать как написано в статье
Сделал. Триггер работает как нужно. При входе всегда пишет "Вход!", при выходе - "Выход!". Порядок текста не меняется.
В общем, проблема, почему-то, была в названии анимации. Открыл модель через MdlVis и назвал анимации "родными" словами Stand, Walk, Death. Стало работать как надо.
Спасибо Rare за
Rare:
ставь скорость анимации на 0%
И nvc123 за то, что натолкнул на мысль этим)
nvc123:
конфликт триггеров,неправильный проигрыш анимаций
ответ
Ошибка при работе с MdlVis. Попробуй открыть модель в версии 1.40, там должно изменение видимости в ключевых кадрах должно заработать. Однако советую сделать копию модели, т.к. 1.40, если не изменяет память, ломает уже настроенную видимость.
ответ
Лучше проверить, присоединён ли он к тем же костям, что и соседние вершины. Если нет — присоединить. Если да, то как сказали Melissa и nvc123.
ответ
Анимация кости базы при death сместилась у конечной точки в линейке анимации. Поправил. В игре потестил, работает. Рассчитать границы нужны когда делаешь новые или изменяешь старые анимации, одна из причин чтоб анимация не сместилась и была на своем месте. Но в твоем случае она сразу не помогла.
ответ
скорее всего связано с кешированием данных, попробуй первым на карту занружать юнитов, и только потом декорации

ответ
8gabriel8:
Вроде ему наоборот надо Spell Throw -> Attack.
с Attack на Spell Throw

zetreisu, открываете модель в mdlvis жмакаете F3, выбераете нужную анимацию, переименовываете, жмакаете Enter и сохраняете модель при выходе.

23

» WarCraft 3 / Не работает триггер (исследование)

Похожие вопросы:

ответ
Filius Dei:
я так и не понял почему ты не можешь просто сделать как улучшение что не так с улучшением как в обычном случае.
дело в описании, вот и не могу так сделать,если сделать через улучшение здания, то при наведении на иконку вплывает подсказка, та же подсказка что будет и у самого здания в списке построек у светлячка, тоесть если делать через улучшение (по идее этот же юнит должен быть и в списке построек (а он там есть) ту подсказку которую я хочу будет лишней. вот пример: Древо жизни превращается в древо мира, при этом все союзные юниты вблизи древа получают повышеную регенерацию здоровья. (а теперь представь что эта подсказка будет в списке построек у светлячка, вообще не то)
Решил проблему путем выбора древа когда истекает однократный таймер, также подумал и решил что наверно лучше делать через способности, а не исследования. Но у меня остался один вопрос, если этот тригер отвечающий за применения этих способностей будет использовать несколько игроков, я не знаю будет ли использоватся оно коректно или нет, также и с отдельным триггером Таймер. Вот что вышло в данный момент:
ответ
Событие: Юнит завершает исследование.

23

» WarCraft 3 / Помогите найти карту

Принятый ответ
Похожие вопросы:

ответ
Увы но нет... Главная особенность той карты что все герои открываются по мере накопления очков за игру на карте, они не открыты сразу и не походу первой катки открываются а лишь с накоплением общих баллов. Я весь мозг сломал уже, в попытках вспомнить. Эх...
ответ
не карта, но есть подозрение, что это оно
ответ
По описанию похожа на Necris.
ответ
konvan5:
Может это "Тьма против живых"?
Вот глянь по видео, оно ли

Карта уже не слабо развилась, может отличаться от того, что ты помнишь новыми локациями и возможностями.
Да оно спасибо большое

23

» WarCraft 3 / Не работает озвучка юнита

Похожие вопросы:

ответ
Установить локально для нужного игрока альтернативную иконку (прозрачную), а так же самое здание или сделать его невидимым.
ответ
8gabriel8:
Я пробовал через все форматы
Простите, но значения точно такие у меня. Не получилось
Да ещё я был ооочень далек от пк и озвучки, я не мог отправить данные.
Ты чувствуешь непоследовательность в своих комментариях? Что пробовал кучу форматов, а значит мог банально перепутать какие-то параметры, но уверен, что параметры именно такие, как указал, при этом ооочень далек от ПК, чтобы ещё раз перепроверить себя.
Я только 10 мин назад проверил, и посмотрел, точно так сделал как сказали (кроме таблицы) не работают, теперь сам сделаю по своему.
А потом ещё:
Не суди строго :)
И минус влепил Hate!
Я просто попросил, ничего обидного нет, с правильной точки зрения.
За идиотов нас здесь считаешь? Пришёл сюда к идиотам с вопросами.
Я никого не считаю идиотом, и даже сам попросил не судить строго, чтоб какой-то РЕАЛЬНЫЙ ИДИОТ не жаловался мне! Я создаю свои карты и мне нужны св-ва и данные для улучшения .
Может быть ты и есть идиот поскольку считаешь что я думаю плохое о других, но не остальные.
Читал, что в архиве war3patch.mpq файл UI\SoundInfo\UnitsAckSounds.slk надо взять и добавить в него новые сеты озвучки.
Спасибо тема закрыта.

23

» WarCraft 3 / Warcraft 3 1.31

Похожие вопросы:

ответ
Держите, с поддержкой любых патчей
ответ
Включить локальные файлы и кинуть ролики в <корневая папка игры>\Movies.
ИЛИ
Попробовать кинуть ролики в <документы пользователя>\WarCraft III\Movies.
Как включить локальные файлы
ответ
Программой CascView www.zezula.net/en/casc/main.html
ответ
XGM Bot:
Похожие вопросы:

ответ
Бэкапы надо было делать, мсье. Перед внесением каких-либо серьезных изменений.
ответ
Проблема решена.
ответ
Вообщем перенастроил Jass New Gen Pack карта как то по другому сохранилась с проверками и всё наладилось)


23

» WarCraft 3 / Система Спавнов

Похожие вопросы:

ответ
Спасибо всем за ответы и пояснения! Закрываю флудильню :с
ответ
Ну для блока урона нужно вручать абилку на 100500 хп, лечить юнита, ну а только потом, с помощью таймера на 0.00 сек. убирать абилку и ставить хп сколько было до всего этого дела.
Могу дать свою карту, там есть и детект физ урона без мемхака и блок урона и снижение урона.
ответ
Slashur, вы даете
call CreateUnitAtLoc(GetTriggerPlayer(), udg_ItemID, udg_temp_point, 0)
изменяете на
call CreateUnitAtLoc(GetTriggerPlayer(), udg_ItemID, udg_temp_point, 270)
всего 1 строчку. всего 1 аргумент. с нуля на 270 поменял и все. стандартное ориентация зданий = 270 град, записана в переменную.
хотел чтобы вы сами помучались. пробуй брать гуи,конвентировать в код. сравнивали. пример
статьи читали бы.
ответ
Все не то. Нужна группа юнитов. При смерти юнита узнается к какой группе он принадлежал (через ХТ или структуру). Юнит удаляется из группы. Если после этого группа остается пуста - запускать таймер респавна с коллбэком. Фсе. Никаких "посмотри как в доте", просто здравый смысл.
В коллбеке же запускать рандомно одну из функций создающую стак, передавать в нее ссылку на группу и записывать в эту группу созданных юников.
ответ
quq_CCCP, у меня крипы спавнятся не из одной точки. Крипы спавнятся в лагерях. В каждом лагере есть несколько точек спавна. При каждом спавне выбирается рандомная точка спавна из рандомного лагеря. Так что с реалистичностью у меня нет проблем.




        local data = {}

        for _, value in pairs(Creep) do
            if type(value) == "table" and value.round ~= nil then
                if data[value.round] == nil then
                    data[value.round] = {}
                end

                table.insert( data[value.round], value )
            end
        end

        for key, value in pairs(data) do
            local i = math.random(1, #value)

            name        [key] = value[i].name
            stylizedName[key] = value[i].stylizedName
            tip         [key] = value[i].tip
            prepare     [key] = value[i].prepare
            count       [key] = value[i].count
            limit       [key] = value[i].limit
            spawnCamp   [key] = value[i].spawnCamp
            startSound  [key] = value[i].startSound
            endSound    [key] = value[i].endSound
            pool        [key] = value[i].pool

            BJDebugMsg('Round ' .. key .. ': ' ..name[key])
        end

23

» WarCraft 3 / Типы юнитов

Похожие вопросы:

ответ
Вопрос в том, что мне делать с ней при каждом новом присвоении.
Ничего
я не могу понять, глобальная она или локальная
Почитайте про локальные переменные. Статьи тоже будут полезны.
Не знаю, не понимаю, что лучше, или оба, но в какой последовательности?
Я тоже ничего не понимаю, когда не вижу кода.
ответ
SirDragdord:
Да, только это. У меня карта - арена и не хочется, чтобы юниты спавнились на трибунах или за воротами. А призвать нужно 3 типа юнита.
Берёшь точку под героем, и поляркой создаёшь три точки рядом (либо одну, если это будет удобно).
Типа так
set Type[1] = 'u001'
set Type[2] = 'u002'
set Type[3] = 'u003'
set P1 = позиция кастера
Цикл А от 1 до 3
set P2 = Полярка от P1 на дистанции 40. под углом ( А * 120. )
Боевая единица - Создать 1 юнита типа Type[A] в позиции P2
очистку и удаление точек - по желанию...
Типа как у стандартных призывов
set P1 = позиция кастера
set P2 = Полярка от P1 на дистанции 200. под углом поворота кастера
Боевая единица - Создать 1 юнита типа 'u001' в позиции P2
Боевая единица - Создать 1 юнита типа 'u002' в позиции P2
Боевая единица - Создать 1 юнита типа 'u003' в позиции P2
ответ
Eternal soul,
Способ что предложил я - вы формируете БД и далее циклом пробегаетесь по массиву unit_type_string[i] и сравниваете его с вашей строкой. Если сравнение прошло успешно то по индексу unit_type[i] находите нужного юнита. Конечно конвертировать было бы более проффесионально, но это способ тоже будет работать.
ответ
Вручил шит пехотинца и скрыл.
И ловите приказ я уже выкладывались где то

23

» WarCraft 3 / Как определить главную характеристику героя?

Похожие вопросы:

ответ
8gabriel8, приоритет менять нельзя
стандартный ии использует это поле для контроля юнитов
пишем свой ии в котором вместо приоритета юзаем свою переменную которой можем задавать любое значение
8gabriel8:
Но для меня это путь в Москву через Владивосток
ну если между тобой и Москвой находится Владивосток то иначе никак(а вар3 как раз расположен за Владивостоком)

23

» WarCraft 3 / Очень нужна помощь с триггером

Похожие вопросы:

ответ
  1. а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
    б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
    В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
    Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
ответ
должен сразу предупредить что делать за тебя никто не будет
теперь по твоим вопросам
  1. чтобы нельзя было кликать скрываешь, даёшь москиты, делаешь видимым
  2. действие проиграть звук и указываешь твою фразу
  3. выбираем всех подходящих(враги,живые) юнитов в радиусе от точки каста и создаём по дамми юниту(юнит без модели, без атаки, с москитами, с нужной способность, время жизни юнита 1 сек) для каждого подходящего юнита приказывая дамми юниту применить нужную способность в подходящего юнита
таким образом каждый дамми юнит применит нужную способность (в твоём случае корни) в 1 подходящего юнита для которого он и был создан а потом исчезнет
  1. система отлова урона
  2. морф юнита либо орбы
всё что я не описал есть в статьях
тебе нужны первые 2 раздела ("Основы" и "Триггеры и объекты")
ответ
В действиях, во вкладке "Герои" находишь "Set Hero level =", потом ставишь "Arithmetic" и делаешь "Hero level - 3".
ответ
Если я правильно помню, можно отследить, становиться ли золото больше определенного значения. Итак:
  • пишем текущее значение в переменную;
  • создаем триггер, который срабатывает, если значение золота становиться больше переменной.
Если триггер сработал:
  • находим разницу;
  • добавляем еще столько же;
  • обновляем переменную;
  • возможно. придется пересоздать триггер.
Также переменную придется обновлять при покупке юнитов, улучшений и прочего, то есть, при трате золота.